using Godot;
using System;
using System.Collections.Generic;
using 游戏设定.基类;

public partial class 组件战斗角色 : Panel
{
    [Export] private Label 角色名称;
    [Export] private Label 角色等级;
    [Export] private ProgressBar 血条;
    [Export] private ProgressBar 蓝条;
    [Export] private Label 血条上限标签;
    [Export] private Label 当前血条标签;
    [Export] private Label 蓝条上限标签;
    [Export] private Label 当前蓝条标签;

    private C角色模型 角色;

    private enum E角色状态
    {
        被攻击,
        攻击,
        死亡
    }

    private Dictionary<E角色状态, bool> 角色状态 = new()
    {
        {E角色状态.被攻击, false},
        {E角色状态.攻击, false},
        {E角色状态.死亡, false},
    };

    public void 初始化(C角色模型 _角色)
    {
        角色 = _角色;
        角色名称.Text = 角色.基础属性.名称;
        角色等级.Text = 角色.基础属性.等级.ToString();

        血条.MaxValue = 角色.战斗属性.血条上限;
        蓝条.MaxValue = 角色.战斗属性.蓝条上限;

        血条.Value = 角色.战斗属性.当前血条;
        蓝条.Value = 角色.战斗属性.当前蓝条;

        血条上限标签.Text = 角色.战斗属性.血条上限.ToString();
        蓝条上限标签.Text = 角色.战斗属性.蓝条上限.ToString();

        当前血条标签.Text = 角色.战斗属性.当前血条.ToString();
        当前蓝条标签.Text = 角色.战斗属性.当前蓝条.ToString();
    }

    public async void 被攻击(float 被攻击的值)
    {
        if (角色状态[E角色状态.死亡] || 角色状态[E角色状态.被攻击])
        {
            return;
        }

        角色状态[E角色状态.被攻击] = true;

        if (角色.战斗属性.当前血条 - 被攻击的值 <= 0)
        {
            角色.战斗属性.当前血条 = 0;
            角色状态[E角色状态.死亡] = true;
        }
        else
        {
            角色.战斗属性.当前血条 -= 被攻击的值;
        }

        血条.Value = 角色.战斗属性.当前血条;
        蓝条.Value = 角色.战斗属性.当前蓝条;
        当前血条标签.Text = 角色.战斗属性.当前血条.ToString();
        当前蓝条标签.Text = 角色.战斗属性.当前蓝条.ToString();

        var 初始位置 = Position;
        Tween 补间动画 = CreateTween().BindNode(this);
        for (int i = 0; i < 3; i++)
        {
            补间动画.TweenProperty(this, "position", new Vector2(初始位置.X - 10, 初始位置.Y), 0.05);
            补间动画.TweenProperty(this, "position", new Vector2(初始位置.X + 10, 初始位置.Y), 0.05);
        }

        await ToSignal(补间动画, Tween.SignalName.Finished);
        Position = 初始位置;

        if (角色状态[E角色状态.死亡])
        {
            Modulate = new Color(1, 1, 1, 0.5f);
        }

        角色状态[E角色状态.被攻击] = false;
    }
}
